Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / tests / backend / test_plugin_security.py

Displaying Raw • Download


tests/backend/test_plugin_security.py fa46dc4ce9ab50cbe66a7a9e4b3bca0140102345 (fa46dc4c) Text, 6.12 KB

T8b949e# SPDX-License-Identifier: 0BSD

Tff7b72import T7ee787io
Tff7b72import T7ee787json
Tff7b72import T7ee787os
Tff7b72import T7ee787zipfile

Tff7b72import T7ee787pytest

Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787plugin_guard Tff7b72import Tb4b4b4(
Te6edf3PluginSecurityErrorTb4b4b4,
Te6edf3normalize_asset_pathTb4b4b4,
Te6edf3safe_extract_zipTb4b4b4,
Te6edf3validate_zip_bytesTb4b4b4,
Tb4b4b4)


Tff7b72def Td2a8ff_make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3appTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787plugin_manager Tff7b72import Te6edf3PluginManager

Tff7b72return Te6edf3PluginManagerTb4b4b4(Tffa657strTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4, Te6edf3appTff7b72=Te6edf3appTb4b4b4)


Tff7b72def Td2a8ff_write_plugin_dirTb4b4b4(Te6edf3rootTb4b4b4, Te6edf3plugin_idTff7b72=Ta5d6ff"Ta5d6ffcom.example.secure-pluginTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3rootTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3manifest Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: Te6edf3plugin_idTb4b4b4,
Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff1.0.0Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffapiVersionTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffSecure PluginTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdescriptionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffSecurity test pluginTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffrontendTa5d6ff"Tb4b4b4: Tb4b4b4{Ta5d6ff"Ta5d6ffentryTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fffrontend/main.jsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffjsTa5d6ff"Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffi18nTa5d6ff"Tb4b4b4: Tb4b4b4{Ta5d6ff"Ta5d6ffdirectoryTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fflocalesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdefaultLocaleTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffenTa5d6ff"Tb4b4b4}Tb4b4b4,
Tb4b4b4}
Tff7b72with Tffa657openTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3rootTb4b4b4, Ta5d6ff"Ta5d6ffplugin.jsonTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Te6edf3jsonTff7b72.Td2a8ffdumpTb4b4b4(Te6edf3manifestTb4b4b4, Te6edf3handleTb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3rootTb4b4b4, Ta5d6ff"Ta5d6fffrontendTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(
Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3rootTb4b4b4, Ta5d6ff"Ta5d6fffrontendTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffmain.jsTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Te6edf3handleTff7b72.Td2a8ffwriteTb4b4b4(
Ta5d6ff"Ta5d6ffexport async function activate(api) Ta5d6ff{Ta5d6ff api.setUi(Ta5d6ff{Ta5d6ff type: Ta5d6ff'Ta5d6fftextTa5d6ff'Ta5d6ff, value: Ta5d6ff'Ta5d6ffokTa5d6ff'Ta5d6ff }); }Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3rootTb4b4b4, Ta5d6ff"Ta5d6fflocalesTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(
Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3rootTb4b4b4, Ta5d6ff"Ta5d6fflocalesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffen.jsonTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Te6edf3jsonTff7b72.Td2a8ffdumpTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6fftitleTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffSecure PluginTa5d6ff"Tb4b4b4}Tb4b4b4, Te6edf3handleTb4b4b4)


Tff7b72def Td2a8ff_zip_directoryTb4b4b4(Te6edf3source_dirTb4b4b4)Tb4b4b4:
Te6edf3buffer Tff7b72= Te6edf3ioTff7b72.Td2a8ffBytesIOTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3zipfileTff7b72.Td2a8ffZipFileTb4b4b4(Te6edf3bufferTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3archiveTb4b4b4:
Tff7b72for Te6edf3baseTb4b4b4, Te6edf3_Tb4b4b4, Te6edf3files Tff7b72in Te6edf3osTff7b72.Td2a8ffwalkTb4b4b4(Te6edf3source_dirTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3name Tff7b72in Te6edf3filesTb4b4b4:
Te6edf3path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3baseTb4b4b4, Te6edf3nameTb4b4b4)
Te6edf3archiveTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrelpathTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3source_dirTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3bufferTff7b72.Td2a8ffgetvalueTb4b4b4(Tb4b4b4)


Tff7b72class T56d364TestPluginGuardTb4b4b4:
Tff7b72def Td2a8fftest_normalize_asset_path_rejects_traversalTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Te6edf3PluginSecurityErrorTb4b4b4)Tb4b4b4:
Te6edf3normalize_asset_pathTb4b4b4(Ta5d6ff"Ta5d6ff../plugin.jsonTa5d6ff"Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Te6edf3PluginSecurityErrorTb4b4b4)Tb4b4b4:
Te6edf3normalize_asset_pathTb4b4b4(Ta5d6ff"Ta5d6ff/etc/passwdTa5d6ff"Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Te6edf3PluginSecurityErrorTb4b4b4)Tb4b4b4:
Te6edf3normalize_asset_pathTb4b4b4(Ta5d6ff"Ta5d6ffC:/Windows/xTa5d6ff"Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Te6edf3PluginSecurityErrorTb4b4b4)Tb4b4b4:
Te6edf3normalize_asset_pathTb4b4b4(Ta5d6ff"Ta5d6fffoo/Tffea00\x00Ta5d6ff/barTa5d6ff"Tb4b4b4)

Tff7b72def Td2a8fftest_zip_entry_rejects_windows_drive_and_nulTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787plugin_guard Tff7b72import Te6edf3_zip_entry_is_safe

Tff7b72assert Te6edf3_zip_entry_is_safeTb4b4b4(Ta5d6ff"Ta5d6ffok/a.wasmTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72assert Te6edf3_zip_entry_is_safeTb4b4b4(Ta5d6ff"Ta5d6ffC:/Windows/xTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72assert Te6edf3_zip_entry_is_safeTb4b4b4(Ta5d6ff"Ta5d6ffa/Tffea00\x00Ta5d6ff/bTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72False

Tff7b72def Td2a8fftest_validate_zip_bytes_rejects_empty_and_random_payloadTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Te6edf3PluginSecurityErrorTb4b4b4)Tb4b4b4:
Te6edf3validate_zip_bytesTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Te6edf3PluginSecurityErrorTb4b4b4)Tb4b4b4:
Te6edf3validate_zip_bytesTb4b4b4(Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff64Tb4b4b4)Tb4b4b4)

Tff7b72def Td2a8fftest_safe_extract_zip_rejects_zip_slipTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3zip_path Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffevil.zipTa5d6ff"
Te6edf3extract_dir Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffextractTa5d6ff"
Te6edf3extract_dirTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3zipfileTff7b72.Td2a8ffZipFileTb4b4b4(Te6edf3zip_pathTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3archiveTb4b4b4:
Te6edf3archiveTff7b72.Td2a8ffwritestrTb4b4b4(Ta5d6ff"Ta5d6ff../escape.txtTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbadTa5d6ff"Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Te6edf3PluginSecurityErrorTb4b4b4)Tb4b4b4:
Te6edf3safe_extract_zipTb4b4b4(Tffa657strTb4b4b4(Te6edf3zip_pathTb4b4b4)Tb4b4b4, Tffa657strTb4b4b4(Te6edf3extract_dirTb4b4b4)Tb4b4b4)

Tff7b72def Td2a8fftest_install_zip_with_traversal_is_rejectedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3_make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3zip_path Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffevil.zipTa5d6ff"
Tff7b72with Te6edf3zipfileTff7b72.Td2a8ffZipFileTb4b4b4(Te6edf3zip_pathTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3archiveTb4b4b4:
Te6edf3archiveTff7b72.Td2a8ffwritestrTb4b4b4(Ta5d6ff"Ta5d6ff../escape.txtTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbadTa5d6ff"Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Te6edf3PluginSecurityErrorTb4b4b4)Tb4b4b4:
Te6edf3managerTff7b72.Td2a8ffinstall_from_zip_bytesTb4b4b4(Te6edf3zip_pathTff7b72.Td2a8ffread_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72def Td2a8fftest_install_valid_zip_roundtripTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3_make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3source Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffsourceTa5d6ff"
Te6edf3_write_plugin_dirTb4b4b4(Tffa657strTb4b4b4(Te6edf3sourceTb4b4b4)Tb4b4b4)
Te6edf3plugin Tff7b72= Te6edf3managerTff7b72.Td2a8ffinstall_from_zip_bytesTb4b4b4(Te6edf3_zip_directoryTb4b4b4(Tffa657strTb4b4b4(Te6edf3sourceTb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72assert Te6edf3pluginTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffcom.example.secure-pluginTa5d6ff"
Tff7b72assert Te6edf3managerTff7b72.Td2a8fflocale_pathTb4b4b4(Te6edf3pluginTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffenTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6fflocales/en.jsonTa5d6ff"Tb4b4b4)

Tff7b72def Td2a8fftest_asset_path_blocks_traversalTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3_make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3source Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffsourceTa5d6ff"
Te6edf3_write_plugin_dirTb4b4b4(Tffa657strTb4b4b4(Te6edf3sourceTb4b4b4)Tb4b4b4)
Te6edf3managerTff7b72.Td2a8ffinstall_from_directoryTb4b4b4(Tffa657strTb4b4b4(Te6edf3sourceTb4b4b4)Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Te6edf3PluginSecurityErrorTb4b4b4)Tb4b4b4:
Te6edf3managerTff7b72.Td2a8ffasset_pathTb4b4b4(Ta5d6ff"Ta5d6ffcom.example.secure-pluginTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff../plugin.jsonTa5d6ff"Tb4b4b4)

Tff7b72def Td2a8fftest_report_failure_auto_disables_after_budgetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3_make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3source Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffsourceTa5d6ff"
Te6edf3_write_plugin_dirTb4b4b4(Tffa657strTb4b4b4(Te6edf3sourceTb4b4b4)Tb4b4b4)
Te6edf3managerTff7b72.Td2a8ffinstall_from_directoryTb4b4b4(Tffa657strTb4b4b4(Te6edf3sourceTb4b4b4)Tb4b4b4)
Te6edf3plugin_id Tff7b72= Ta5d6ff"Ta5d6ffcom.example.secure-pluginTa5d6ff"
Te6edf3managerTff7b72.Td2a8ffenableTb4b4b4(Te6edf3plugin_idTb4b4b4)
Tff7b72for Te6edf3_ Tff7b72in Tffa657rangeTb4b4b4(T79c0ff5Tb4b4b4)Tb4b4b4:
Te6edf3managerTff7b72.Td2a8ffreport_failureTb4b4b4(Te6edf3plugin_idTb4b4b4, Ta5d6ff"Ta5d6ffworker crashTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffrontendTa5d6ff"Tb4b4b4)
Te6edf3plugin Tff7b72= Te6edf3managerTff7b72.Td2a8ffget_pluginTb4b4b4(Te6edf3plugin_idTb4b4b4)
Tff7b72assert Te6edf3plugin Tff7b72is Tff7b72not Tff7b72None
Tff7b72assert Te6edf3pluginTb4b4b4[Ta5d6ff"Ta5d6ffenabledTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Tff7b72assert Te6edf3pluginTb4b4b4[Ta5d6ff"Ta5d6ffauto_disabled_reasonTa5d6ff"Tb4b4b4]

Tff7b72def Td2a8fftest_enable_rejects_missing_frontend_entryTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3_make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3source Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffbrokenTa5d6ff"
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3sourceTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3manifest Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffcom.example.brokenTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff1.0.0Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffapiVersionTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6fffrontendTa5d6ff"Tb4b4b4: Tb4b4b4{Ta5d6ff"Ta5d6ffentryTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fffrontend/missing.jsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffjsTa5d6ff"Tb4b4b4}Tb4b4b4,
Tb4b4b4}
Tff7b72with Tffa657openTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3sourceTb4b4b4, Ta5d6ff"Ta5d6ffplugin.jsonTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Te6edf3jsonTff7b72.Td2a8ffdumpTb4b4b4(Te6edf3manifestTb4b4b4, Te6edf3handleTb4b4b4)
Te6edf3managerTff7b72.Td2a8ffinstall_from_directoryTb4b4b4(Tffa657strTb4b4b4(Te6edf3sourceTb4b4b4)Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149FileNotFoundErrorTb4b4b4)Tb4b4b4:
Te6edf3managerTff7b72.Td2a8ffenableTb4b4b4(Ta5d6ff"Ta5d6ffcom.example.brokenTa5d6ff"Tb4b4b4)

Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffparametrizeTb4b4b4(
Ta5d6ff"Ta5d6ffpayloadTa5d6ff"Tb4b4b4,
Tb4b4b4[
Ta5d6ffbTa5d6ff"Tffea00\x91Tffea00\x0cTffea00\xb0Tffea00\xd9Tffea00\xe8Ta5d6ff>Tffea00\x1eTa5d6ffZ Tffea00\x00Tffea00\x94Tffea00\xbeTffea00\x9aTa5d6ffJTffea00\xf8Tffea00\xedTa5d6ff(uTffea00\xa6Tffea00\xbfTffea00\xa9Tffea00\x05Tffea00\x8bTffea00\x80Tffea00\xbeTffea00\x07Tffea00\xf7Ta5d6ff>Tffea00\x06Ta5d6ffbTffea00\xedTa5d6ff"Tb4b4b4,
Ta5d6ffbTa5d6ff"Ta5d6ffnot-a-zipTa5d6ff"Tb4b4b4,
Ta5d6ffbTa5d6ff"Tffea00\x00Tffea00\x01Tffea00\x02Ta5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8fftest_fuzz_random_install_payloads_are_rejectedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3tmp_pathTb4b4b4, Te6edf3payloadTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3_make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3managerTff7b72.Td2a8ffinstall_from_zip_bytesTb4b4b4(Te6edf3payloadTb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────